home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / langs / dl_exsrc.zoo / reghack.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1994-07-04  |  3.8 KB  |  193 lines

  1. #define REAL_REG_ENTRY_POINT(x)    R ## x ## :
  2. #define REG_ENTRY_POINT(x)    REAL_REG_ENTRY_POINT(x)
  3. #define REAL_REG_FUNC_NAME(x)    R ## x
  4. #define REG_FUNC_NAME(x)    REAL_REG_FUNC_NAME(x)
  5. #define REAL_C_FUNC_NAME(x)    _ ## x
  6. #define C_FUNC_NAME(x)        REAL_C_FUNC_NAME(x)
  7.  
  8. #define rlmemcpy    1
  9. #define rlmemmove    2
  10. #define rmemicmp    3
  11. #define rstradj        4
  12. #define rstristr    5
  13. #define rstrnset    6
  14. #define rstrpcpy    7
  15. #define rstrpos        8
  16. #define rstrrpbrk    9
  17. #define rstrrpos    10
  18. #define rstrset        11
  19. #define rstrtrim    12
  20. #define rsubnstr    13
  21. #define rsubstr        14
  22.  
  23. #if TARGET == rlmemcpy
  24. #  define NAME        lmemcpy
  25. #  define PARMREGS    1
  26. #  define SAVEREGS    1
  27. #  define ADD_TST_L
  28. #elif TARGET == rlmemmove
  29. #  define NAME        lmemmove
  30. #  define PARMREGS    1
  31. #  define SAVEREGS    1
  32. #  define ADD_TST_L
  33. #elif TARGET == rmemicmp
  34. #  define NAME        memicmp
  35. #  define PARMREGS    2
  36. #  define SAVEREGS    2
  37. #  define ADD_TST_W
  38. #elif TARGET == rstradj
  39. #  define NAME        stradj
  40. #  define PARMREGS    3
  41. #  define SAVEREGS    1
  42. #  define ADD_TST_L
  43. #elif TARGET == rstristr
  44. #  define NAME        stristr
  45. #  define PARMREGS    4
  46. #  define SAVEREGS    3
  47. #  define ADD_TST_L
  48. #elif TARGET == rstrnset
  49. #  define NAME        strnset
  50. #  define PARMREGS    5
  51. #  define SAVEREGS    4
  52. #  define ADD_TST_L
  53. #elif TARGET == rstrpcpy
  54. #  define NAME        strpcpy
  55. #  define PARMREGS    6
  56. #  define SAVEREGS    5
  57. #  define ADD_TST_L
  58. #elif TARGET == rstrpos
  59. #  define NAME        strpos
  60. #  define PARMREGS    3
  61. #  define SAVEREGS    6
  62. #  define ADD_TST_W
  63. #elif TARGET == rstrrpbrk
  64. #  define NAME        strrpbrk
  65. #  define PARMREGS    4
  66. #  define SAVEREGS    7
  67. #  define ADD_TST_L
  68. #elif TARGET == rstrrpos
  69. #  define NAME        strrpos
  70. #  define PARMREGS    3
  71. #  define SAVEREGS    4
  72. #  define ADD_TST_W
  73. #elif TARGET == rstrset
  74. #  define NAME        strset
  75. #  define PARMREGS    3
  76. #  define SAVEREGS    8
  77. #  define ADD_TST_L
  78. #elif TARGET == rstrtrim
  79. #  define NAME        strtrim
  80. #  define PARMREGS    4
  81. #  define SAVEREGS    9
  82. #  define ADD_TST_L
  83. #elif TARGET == rsubnstr
  84. #  define NAME        subnstr
  85. #  define PARMREGS    7
  86. #  define SAVEREGS    2
  87. #  define ADD_TST_L
  88. #elif TARGET == rsubstr
  89. #  define NAME        substr
  90. #  define PARMREGS    7
  91. #  define SAVEREGS    2
  92. #  define ADD_TST_L
  93. #else
  94. #error Invalid value for TARGET
  95. #endif
  96.  
  97.     .text
  98.     .globl    REG_FUNC_NAME(NAME)
  99.  
  100. REG_ENTRY_POINT(NAME)
  101.  
  102. #if SAVEREGS == 1
  103.     movem.l    d2/a2,-(sp)
  104. #elif SAVEREGS == 2
  105.     movem.l    a2,-(sp)
  106. #elif SAVEREGS == 3
  107. #elif SAVEREGS == 4
  108.     movem.l    d1/a1/a2,-(sp)
  109. #elif SAVEREGS == 5
  110.     movem.l    d1/d2/a2,-(sp)
  111. #elif SAVEREGS == 6
  112.     movem.l    d2/a1/a2,-(sp)
  113. #elif SAVEREGS == 7
  114.     movem.l    a1,-(sp)
  115. #elif SAVEREGS == 8
  116.     movem.l    d1/d2/a1/a2,-(sp)
  117. #elif SAVEREGS == 9
  118.     movem.l    d2/a1,-(sp)
  119. #else
  120. #endif
  121.  
  122. #if PARMREGS == 1
  123.     move.l    d1,-(sp)
  124.     movem.l    a0/a1,-(sp)
  125. #elif PARMREGS == 2
  126.     move.w    d2,-(sp)
  127.     movem.l    a0/a1,-(sp)
  128. #elif PARMREGS == 3
  129.     move.w    d1,-(sp)
  130.     move.l    a0,-(sp)
  131. #elif PARMREGS == 4
  132.     movem.l    a0/a1,-(sp)
  133. #elif PARMREGS == 5
  134.     movem.w    d1/d2,-(sp)
  135.     move.l    a0,-(sp)
  136. #elif PARMREGS == 6
  137.     movem.l    a1/a2,-(sp)
  138.     move.l    a0,-(sp)
  139. #elif PARMREGS == 7
  140.     move.w    d1,-(sp)
  141.     move.w    d2,-(sp)
  142.     movem.l    a0/a1,-(sp)
  143. #else
  144. #endif
  145.  
  146.     jsr    C_FUNC_NAME(NAME)
  147.  
  148. #if PARMREGS == 1
  149.     lea    12(sp),sp
  150. #elif PARMREGS == 2
  151.     lea    10(sp),sp
  152. #elif PARMREGS == 3
  153.     addq.l    #6,sp
  154. #elif PARMREGS == 4
  155.     addq.l    #8,sp
  156. #elif PARMREGS == 5
  157.     addq.l    #8,sp
  158. #elif PARMREGS == 6
  159.     lea    12(sp),sp
  160. #elif PARMREGS == 7
  161.     lea    12(sp),sp
  162. #else
  163. #endif
  164.  
  165. #if SAVEREGS == 1
  166.     movem.l    (sp)+,d2/a2
  167. #elif SAVEREGS == 2
  168.     movem.l    (sp)+,a2
  169. #elif SAVEREGS == 3
  170. #elif SAVEREGS == 4
  171.     movem.l    (sp)+,d1/a1/a2
  172. #elif SAVEREGS == 5
  173.     movem.l    (sp)+,d1/d2/a2
  174. #elif SAVEREGS == 6
  175.     movem.l    (sp)+,d2/a1/a2
  176. #elif SAVEREGS == 7
  177.     movem.l    (sp)+,a1
  178. #elif SAVEREGS == 8
  179.     movem.l    (sp)+,d1/d2/a1/a2
  180. #elif SAVEREGS == 9
  181.     movem.l    (sp)+,d2/a1
  182. #else
  183. #endif
  184.  
  185. #ifdef ADD_TST_W
  186.     tst.w    d0
  187. #else
  188. #  ifdef ADD_TST_L
  189.     tst.l    d0
  190. #  endif
  191. #endif
  192.     rts
  193.